fork download
  1. <?php
  2.  
  3. function arrayGetSubset($arr, $start, $end, $step = 1, $by_value = false) {
  4.  
  5. /**
  6.   * @arr - массив
  7.   * @start - начало выборки
  8.   * @end - конец выборки
  9.   * @step - инкремент между элементами последовательности. step должен быть положительным числом
  10.   * @by_value - если этот параметр равен true, то выбор подмножества осуществляется не по ключам, а по значениям
  11.   */
  12.  
  13. $keys = range($start, $end);
  14.  
  15. $res = $by_value ? array_intersect($arr, $keys) : array_intersect_key($arr, array_flip($keys));
  16.  
  17. if ($step > 1) {
  18.  
  19. $keys_res = $by_value ? $res : array_keys($res);
  20. $step_keys = range($start, count($keys_res) - 1, $step);
  21. $steped = array_intersect_key($keys_res, array_flip($step_keys));
  22.  
  23. $res = $by_value ? array_intersect($res, $steped) : array_intersect_key($res, array_flip($steped));
  24.  
  25. }
  26.  
  27. return $res;
  28.  
  29. }
  30.  
  31. // test
  32.  
  33. $arr = [0 => "a", 1 => "b", 4 => "c", 6 => "d", 9 => "e", 13 => "f", 14 => "g", 16 => "h", 17 => "i", 19 => "j", 20 => "k", 21 => "l"];
  34.  
  35. print_r(arrayGetSubset($arr, 0, 20));
  36. print_r(arrayGetSubset($arr, 0, 20, 2));
  37. print_r(arrayGetSubset($arr, 0, 20, 3));
  38.  
  39. //$arr = [0, 1, 3, 5, 7, 9, 10, 11, 12, 14, 15, 18, 20, 21, 22];
  40. $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22];
  41.  
  42. print_r(arrayGetSubset($arr, 1, 20, 1, true));
  43. print_r(arrayGetSubset($arr, 1, 20, 2, true));
  44. print_r(arrayGetSubset($arr, 1, 20, 3, true));
Success #stdin #stdout 0s 82560KB
stdin
Standard input is empty
stdout
Array
(
    [0] => a
    [1] => b
    [4] => c
    [6] => d
    [9] => e
    [13] => f
    [14] => g
    [16] => h
    [17] => i
    [19] => j
    [20] => k
)
Array
(
    [0] => a
    [4] => c
    [9] => e
    [14] => g
    [17] => i
    [20] => k
)
Array
(
    [0] => a
    [6] => d
    [14] => g
    [19] => j
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [12] => 13
    [13] => 14
    [14] => 15
    [15] => 16
    [16] => 17
    [17] => 18
    [18] => 19
    [19] => 20
)
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [7] => 8
    [9] => 10
    [11] => 12
    [13] => 14
    [15] => 16
    [17] => 18
    [19] => 20
)
Array
(
    [1] => 2
    [4] => 5
    [7] => 8
    [10] => 11
    [13] => 14
    [16] => 17
    [19] => 20
)